package com.bootcamp.s2_0922.ds.Exercise._0930_Ex;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * @program: myClassCode
 * @description:
 * @author: Keyu Li
 * @create: 2021-09-30 19:56
 **/

public class Ex4_TwoNumSum {
    public static void main(String[] args) {
//        int[] nums = {7, 2, 11, 15};
//        int target = 9;
        // test 相同两个元素
        int[] nums = {8, 2, 2, 15, 17, 19, 8, 6, 7, 7};
        int target = 16;
        System.out.println(nums);
        // 如果假设只对应一种结果，那么如果得到结果要么为两个相同的数，
        // 要么为两个不相同的数，且当两个数为相同数时候，数组内不存在另外相同的数
        // 假设数组随机排列：
        // 先将数组转化为 List
        List<Integer> numL = new ArrayList<>(nums.length);
        for (int i = 0; i < nums.length; i++) {
            numL.add(nums[i]);
        }
        // 对数组进行排序
        Arrays.sort(nums);
        // 得到对应值两个数
        int[] numResult = twoNumSum(nums, target);
        // 在List找到对应下标，此为唯一情况
        int index0 = numL.indexOf(numResult[0]);
        // 如果得到两个相等的数
        if (numResult[0]==numResult[1]) numL.set(index0, numResult[0]+1);
        int index1 = numL.indexOf(numResult[1]);
        System.out.println(index0 + ": " + numResult[0]);
        System.out.println(index1 + ": " + numResult[1]);
    }

    private static int[] twoNumSum(int[] nums, int target) {
        // 定义两个指针，记录头尾下标
        int head = 0;
        int rear = nums.length - 1;
        while (head < rear) {
            int sum = nums[head] + nums[rear];
            if (sum < target) head++;
            else if (sum > target) rear--;
            else return new int[]{nums[head], nums[rear]};
        }
        return null;
    }
}
